/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package util;

/**
 *
 * @author Administrateur
 */
public class plateauPourBidouille extends PlateauTablut{
    public static byte loin = 100;
    byte[] pileNS = new byte[81];
    byte[] pileEW = new byte[81];
    int ptrNS = -1, ptrEW = -1;

    public plateauPourBidouille() {
        super();
    }
    public byte[] listeExit = {
        typeCase[coord(3, 0)],
        typeCase[coord(4, 0)],
        typeCase[coord(5, 0)],

        typeCase[coord(3, 8)],
        typeCase[coord(4, 8)],
        typeCase[coord(5, 8)],

        typeCase[coord(8, 3)],
        typeCase[coord(8, 4)],
        typeCase[coord(8, 5)],

        typeCase[coord(0, 3)],
        typeCase[coord(0, 4)],
        typeCase[coord(0, 5)]
    };
    /**
     * Permet de savoir quelle cases sont accessibles par le roi et en combien de mouvement.
     * @param depart
     */
    private int[] chapeaudExplorateur(byte depart){
    int[] tab = new int[81];
    int pas = date%2; // cout de 0 si blanc, cout de 1 si noir
    int last, nextLastEW, nextLastNS;
    for(int i = tab.length; --i>= 0; ){
        tab[i] = loin;
    }
    tab[depart] = 0;

    ptrNS = 0 ; ptrEW =0;
    nextLastEW = ptrEW;
    nextLastNS = ptrNS;
    pileNS[ptrNS] = depart; pileEW[ptrEW] = depart;

    do{
        last = nextLastEW;
        nextLastEW = ptrEW;
        for(int i = ptrEW; --i>=last;){
            explorateurESTOUEST(depart, pas+2, tab);
        }

        last = nextLastNS;
        nextLastNS = ptrNS;
        for(int i = ptrNS; --i>=last;){
            explorateurNORDSUD(depart, pas+2, tab);
        }
    pas++;
    }while(ptrNS > nextLastNS || ptrEW > nextLastEW);

    return tab;
    }
    
    private void explorateurESTOUEST(int depart, int pas, int[] carte){
    int x = x(depart);
    int y = y(depart);
    int tmp;
    for(int i = x; ++i<9; ){
        tmp = y+i;
        if(plateau[tmp] == VID){
            if(carte[tmp] > pas) {
                carte[tmp] = pas; 
                ptrEW++;
                pileEW[ptrEW] = (byte)tmp;
            }
        }else{break;}
    }
    for(int i = x; --i>=0; ){
        tmp = y+i;
        if(plateau[tmp] == VID){
            if(carte[tmp] > pas) {
                carte[tmp] = pas; 
                ptrEW++;
                pileEW[ptrEW] = (byte)tmp;
            }
        }else{break;}
    }
    }
    
    private void explorateurNORDSUD(int depart, int pas, int[] carte){
        //j'ai swappé les deux variable
    int x = y(depart);
    int y = x(depart);
    int tmp;
    for(int i = x; ++i<9; ){
        tmp = y+i*9;
        if(plateau[tmp] == VID){
            if(carte[tmp] > pas) {
                carte[tmp] = pas;
                ptrNS++;
                pileNS[ptrNS] = (byte)tmp;
            }
        }else{break;}

    }
    for(int i = x; --i>=0; ){
        tmp = y+i*9;
        if(plateau[tmp] == VID){
            if(carte[tmp] > pas) {
                carte[tmp] = pas;
                ptrNS++;
                pileNS[ptrNS] = (byte)tmp;

            }
        }else{break;}
    }
    
    }
    /**
     * Attention, Couteux!
     * @return la longueur, en demi-coup, du plus court chemin de sorti du Roi.
     */
    public int sortieRapide(){
    int tmp = loin;
    int[] tab = chapeaudExplorateur(positions[0]);
    for(int i = listeExit.length; --i>= 0; ){
        tmp = Math.min(tmp, tab[listeExit[i]]);
    }
    return tmp;
    }

    public int difference_pion(){
        return nbblanc - nbnoir; 
    }
    
    public int dif_CarréPion(){
        return nbblanc*nbblanc - nbnoir*nbnoir; 
    }

    public static void main(String[] args){

    }
}
